2026-10-13T09:39:18.9310076Z ##[group]Run npm run test:deploy
2026-10-13T09:39:18.9310129Z [36;1mnpm run test:deploy[0m
2026-10-13T09:39:18.9310145Z shell: /usr/bin/bash -e {0}
2026-10-13T09:39:18.9310173Z env:
2026-10-13T09:39:18.9310183Z   CARGO_TERM_COLOR: never
2026-10-13T09:39:18.9310263Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-13T09:39:18.9310275Z   WRANGLER_SEND_METRICS: false
2026-10-13T09:39:18.9310284Z ##[endgroup]
2026-10-13T09:39:19.0755662Z 
2026-10-13T09:39:19.0755773Z > test:deploy
2026-10-13T09:39:19.0755816Z > node --test "scripts/deploy/*.test.mjs"
2026-10-13T09:39:19.0755834Z 
2026-10-13T09:39:19.2089201Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (5.059616ms)
2026-10-13T09:39:19.2116815Z ✔ the toolchain is read from rustc -V (0.41935ms)
2026-10-13T09:39:19.2117016Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.345178ms)
2026-10-13T09:39:19.2117143Z ✔ a unit's hash is read from its files and folders (0.463385ms)
2026-10-13T09:39:19.2117193Z ✔ only the units the build did not use are pruned (4.115018ms)
2026-10-13T09:39:20.9077595Z error: no matching package named `base64` found
2026-10-13T09:39:20.9078278Z location searched: crates.io index
2026-10-13T09:39:20.9083590Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-13T09:39:20.9083733Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-13T09:39:20.9083789Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-13T09:39:21.3232838Z ✔ the manifest matches every wrangler config in the repository (32.994465ms)
2026-10-13T09:39:21.3232972Z ✔ every wrangler.jsonc is found, and only checked-in ones (21.470835ms)
2026-10-13T09:39:21.3233072Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (30.736636ms)
2026-10-13T09:39:21.3233129Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.750987ms)
2026-10-13T09:39:21.3233178Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (1.016355ms)
2026-10-13T09:39:21.3233223Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.988454ms)
2026-10-13T09:39:21.3233268Z ✔ shared crates and packages are read from workspace metadata (0.311257ms)
2026-10-13T09:39:21.3233325Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.409355ms)
2026-10-13T09:39:21.3233373Z ✔ services/runner/base.json records the base its folder builds (13.304715ms)
2026-10-13T09:39:21.3233421Z ✔ an image's hash ignores line endings, and its tags say what they are (111.076061ms)
2026-10-13T09:39:21.3233461Z ✔ only the lockfile entries the runner is built from name its image (0.601603ms)
2026-10-13T09:39:21.3233507Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (21.758667ms)
2026-10-13T09:39:21.3233546Z ✔ the registry is asked for an image's manifest, without Docker (1.456096ms)
2026-10-13T09:39:21.3233590Z ✔ a push counts only when it ends with a digest, and is tried again (1.029586ms)
2026-10-13T09:39:21.3233627Z ✔ a static Linux binary is told from a dynamic one (1.250858ms)
2026-10-13T09:39:21.3233688Z ﹣ path dependencies agree with Cargo's own resolved graph (1307.451927ms) # cargo metadata could not resolve offline
2026-10-13T09:39:21.3233869Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (51.480339ms)
2026-10-13T09:39:21.3233913Z ✔ a shared crate's change reaches every unit built from it, and no other (0.789705ms)
2026-10-13T09:39:21.3233954Z ✔ a shared package's change reaches what imports it (0.240731ms)
2026-10-13T09:39:21.3233995Z ✔ a crate's tests, benches and examples deploy nothing (0.396014ms)
2026-10-13T09:39:21.3234033Z ✔ a Rust file compiled only for tests is found from what declares it (1.098529ms)
2026-10-13T09:39:21.3234064Z ✔ this repository's test-only sources are read from git (226.203355ms)
2026-10-13T09:39:21.3234100Z ✔ decide: a change only to tests deploys nothing (1.637238ms)
2026-10-13T09:39:21.3234129Z ✔ own folders, declared inputs and root files (1.228915ms)
2026-10-13T09:39:21.3234163Z ✔ a Cargo.lock change reaches only crates that use what changed (0.507271ms)
2026-10-13T09:39:21.3234195Z ✔ a package-lock change reaches through workspace links (0.506651ms)
2026-10-13T09:39:21.3234223Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.587983ms)
2026-10-13T09:39:21.3234257Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.173841ms)
2026-10-13T09:39:21.3234291Z ✔ decide: Cargo.lock counts only where it reaches (0.449345ms)
2026-10-13T09:39:21.3234324Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.180942ms)
2026-10-13T09:39:21.3234358Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (0.850366ms)
2026-10-13T09:39:21.3234389Z ✔ units are picked by short name, folder or Worker name (0.417517ms)
2026-10-13T09:39:21.3234577Z ✔ a CI job installs only what its units need (0.877247ms)
2026-10-13T09:39:21.3234608Z ✔ a deploy is annotated with its commit, and read back (0.23982ms)
2026-10-13T09:39:21.3234642Z ✔ the live commit: the live version's, looking through secret changes (0.410226ms)
2026-10-13T09:39:21.3234673Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.35342ms)
2026-10-13T09:39:21.3234702Z ✔ the API's answers: the live commit as Wrangler's would give it (0.933782ms)
2026-10-13T09:39:21.7054528Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (502.679297ms)
2026-10-13T09:39:21.7055213Z ✔ the API is used only with the token Wrangler would be given (0.607883ms)
2026-10-13T09:39:21.7055282Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.730348ms)
2026-10-13T09:39:21.7685250Z ✔ the pool runs everything, no more than its limit at once (16.110046ms)
2026-10-13T09:39:21.7685413Z ✔ self-hosting builds every Rust service the manifest says it runs (1.270877ms)
2026-10-13T09:39:21.7685462Z ✔ the self-hosting architecture page names every unit (0.369074ms)
2026-10-13T09:39:21.7722939Z ✔ the architecture's services page names every unit, with the services it binds to (3.175697ms)
2026-10-13T09:39:21.7723080Z ✔ resolveStack works on a manifest with no workspace crates or packages (2.569458ms)
2026-10-13T09:39:21.7723155Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.414271ms)
2026-10-13T09:39:21.7723195Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.941775ms)
2026-10-13T09:39:21.7723240Z ✔ a failed wrangler command is reported by its error, not its trace (0.361863ms)
2026-10-13T09:39:21.7723281Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.534593ms)
2026-10-13T09:39:21.7723327Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.310477ms)
2026-10-13T09:39:21.7723366Z ✔ the deploy tool itself parses: a test that never imports it would not notice (35.407698ms)
2026-10-13T09:39:22.0401405Z ✔ the statements are all there (1.088995ms)
2026-10-13T09:39:22.0401591Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (32.736539ms)
2026-10-13T09:39:22.0401647Z ✔ revoking an unused invite gives it back; an expired one never counted (59.0078ms)
2026-10-13T09:39:22.0401701Z ✔ a used invite is spent: revoking it does nothing and it still counts (28.450163ms)
2026-10-13T09:39:22.0401741Z ✔ a pending invite for the same address is found; a revoked one is not (29.30111ms)
2026-10-13T09:39:22.0401783Z ✔ staff grants add to the twenty and can take some back (27.640568ms)
2026-10-13T09:39:22.0401821Z ✔ signing up from the link spends the invite once and records who invited whom (23.736386ms)
2026-10-13T09:39:22.1067795Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.607053ms)
2026-10-13T09:39:22.1067952Z ✔ an install that ends without saying why, or stalls, is tried again (0.173541ms)
2026-10-13T09:39:22.1068003Z ✔ a dropped connection is tried again until the install passes (0.88632ms)
2026-10-13T09:39:22.1068028Z ✔ a real error fails at once (0.257848ms)
2026-10-13T09:39:22.1068065Z ✔ it gives up after its tries, with npm's exit code (0.162694ms)
2026-10-13T09:39:22.1068086Z ✔ a stalled install is run again (0.117035ms)
2026-10-13T09:39:22.2412234Z ✔ webhooks: the hourly purge deletes old deliveries by time (2.547925ms)
2026-10-13T09:39:22.3901798Z ✔ billing: this month's users are read from an index, not the ledger (39.936117ms)
2026-10-13T09:39:22.3901908Z ✔ events: a repository's events of one type, newest first, page by page (2.693744ms)
2026-10-13T09:39:22.3901963Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (10.032232ms)
2026-10-13T09:39:22.3902008Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (1.952572ms)
2026-10-13T09:39:22.3902068Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (1.770889ms)
2026-10-13T09:39:22.3902105Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (1.586031ms)
2026-10-13T09:39:22.3902150Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (4.7894ms)
2026-10-13T09:39:22.3902198Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.771488ms)
2026-10-13T09:39:22.3902241Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (1.22509ms)
2026-10-13T09:39:22.3902277Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.415604ms)
2026-10-13T09:39:22.3902310Z ✔ image references and bearer challenges are read (0.731087ms)
2026-10-13T09:39:22.3902368Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (31.370017ms)
2026-10-13T09:39:22.3902403Z ✔ a base that is not where it should be, or not what base.json says, stops it (1.18554ms)
2026-10-13T09:39:22.3902453Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (1.980092ms)
2026-10-13T09:39:22.4131377Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-13T09:39:22.4391831Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-13T09:39:22.4419407Z ✔ fields read numbers, ranges, lists and steps (1.648015ms)
2026-10-13T09:39:22.4435006Z ✔ the services' crons match when hosted g1t's would fire (1.873733ms)
2026-10-13T09:39:22.4435269Z ✔ what is due is each matching cron of each service (0.400752ms)
2026-10-13T09:39:22.4439929Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (27.161779ms)
2026-10-13T09:39:22.5490523Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (35.975611ms)
2026-10-13T09:39:22.5502333Z ✔ an announcement that fails is a warning, never a failed deploy (1.054914ms)
2026-10-13T09:39:22.5503024Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (0.942215ms)
2026-10-13T09:39:22.5511643Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.789535ms)
2026-10-13T09:39:22.5657640Z ℹ tests 92
2026-10-13T09:39:22.5658856Z ℹ suites 0
2026-10-13T09:39:22.5659249Z ℹ pass 91
2026-10-13T09:39:22.5659787Z ℹ fail 0
2026-10-13T09:39:22.5660132Z ℹ cancelled 0
2026-10-13T09:39:22.5660393Z ℹ skipped 1
2026-10-13T09:39:22.5660618Z ℹ todo 0
2026-10-13T09:39:22.5660912Z ℹ duration_ms 3446.42565
